package educar.models;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedList;

import educar.db.DbConnection;
import educar.db.JPA;

public class Mensaje
{
	private static JPA jpa = new JPA();
    private static final String noAsignado = "-1";
    
    private String id;
	private Materia materia;
	private Docente docente;
	private String fecha;
	private String titulo;
	private String descripcionCorta;
	private String descripcionLarga;
	
	
    
   /* public String toString()
    {
    	//return descripcion +  " - " + codigoActividad;
    }*/
    
    public Mensaje(Materia m ,Docente d, String titulo, String desC,String desL)
    {
        this.materia = m;
        this.docente = d;
        this.titulo = titulo;
        this.descripcionCorta = desC;
        this.descripcionLarga = desL;
        this.id = noAsignado;
        
        //asigno la fecha
        Date dt = new Date();
        DateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        this.fecha = f.format(dt);
    }
    
    public boolean save()
    {
    
        String[] columns = {"codigoMensaje", "codigoMateria", "dniDocente","fecha","titulo","descripcionCorta","descripcionLarga" };
        PreparedStatement stm = jpa.newRecord(DbConnection.bd+".actividad", columns);
        try
        {
            stm.setString(1, null);
            stm.setString(2, this.materia.getCodigo());
            stm.setString(3, this.docente.getDni());
            stm.setString(4, this.fecha);
            stm.setString(5, this.titulo);
            stm.setString(6, this.descripcionCorta);
            stm.setString(7, this.descripcionLarga);
            
        }
        catch (SQLException e)
        {
            e.printStackTrace();
            return false;
        }

        jpa.create(stm);
        actualizarCodigoAlMaximo();

        return true;
    }

    //para utilizar al guardar un cargo en la base de datos
    //y obtener el codigo que le fue asignado en el objeto
    //utilizar sólo inmediatamente despues de guardar en la base de datos
    private void actualizarCodigoAlMaximo()
    {
        ResultSet rs = jpa.showMaxColumn("mensaje", "id");
        try
        {
            if (rs.next())
            {
                this.id = rs.getString(1);
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    public void destroy() throws mensajeNotFound
    {
        if (this.id.compareTo(noAsignado) != 0)
            jpa.destroy("mensaje", "codigoMensaje", this.id);
        else
            throw new mensajeNotFound();
    }

    public void update() throws mensajeNotFound
    {
        if (this.id.compareTo(noAsignado) != 0)
            jpa.update("mensaje", "descripcionCorta", this.descripcionCorta, "codigoMensaje", this.id);
        else
            throw new mensajeNotFound();
    }

    public static Mensaje getbyCodigo(String codigo) throws mensajeNotFound, docenteNotFound, materiaNotFound
    {
        ResultSet rs = null;
        Mensaje msj = null;
        Docente d = null;
        Materia m = null;

        rs = jpa.getByField("mensaje", "codigoMensaje", codigo);

        try
        {
        	m = Materia.getMateriabyCodigo(rs.getString(2));
        	d = Docente.getDocenteByDni(rs.getString(3));
            if (rs.next())
            {
                msj = new Mensaje(m ,d,rs.getString(5), rs.getString(6),rs.getString(7));
            }
            else
            {
                throw new mensajeNotFound();
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }

        return msj;
    }

    public static LinkedList<Mensaje> getAllByMateria(Materia m) throws materiaNotFound, docenteNotFound
    {
        return getAllByMateria(m.getCodigo());
    }

    public static LinkedList<Mensaje> getAllByMateria(String codMateria) throws materiaNotFound, docenteNotFound
    {
        ResultSet rs = null;
        LinkedList<Mensaje> mensajes= new LinkedList<Mensaje>();
        Docente d = null;
        Materia m = null;

        rs = jpa.getByField("mensaje", "codigoMateria", codMateria);

        try
        {
        	m = Materia.getMateriabyCodigo(codMateria);
        	d = Docente.getDocenteByDni(rs.getString(3));
            while (rs.next())
            {
                mensajes.add(new Mensaje(m ,d,rs.getString(5), rs.getString(6),rs.getString(7)));
            }

        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }

        return mensajes;
    }

    public static String[] getAllByMateriasArray(String codMateria) throws materiaNotFound, docenteNotFound
    {
        LinkedList<Mensaje> msj = getAllByMateria(codMateria);
        String[] mensajes = new String[msj.size()];
        for (int i = 0; i < msj.size(); i++)
            mensajes[i] = msj.get(i).toString();

        return mensajes;
    }
    


    public String getId()
    {
        return this.id;
    }
    
    public void setId(String id)
    {
    	this.id= id;
    }

    public Materia getMateria()
    {
        return materia;
    }

    public void setMateria(String codMateria) throws materiaNotFound
    {
       this.materia = Materia.getMateriabyCodigo(codMateria);
    }

    public void setMateria(Materia m)
    {
        materia = m;
    }
    
    public Docente getDocente()
    {
        return this.docente;
    }

    public void setDocente(String dniDocente) throws docenteNotFound
    {
       this.docente = Docente.getDocenteByDni(dniDocente);
    }

    public void setDocente(Docente d)
    {
        this.docente = d;
    }

    public String getFecha()
    {
        return this.fecha;
    }
    
    public void setFecha(String fecha)
    {
    	this.fecha= fecha;
    }
    
    public String getTitulo()
    {
        return this.titulo;
    }
    
    public void setTitulo(String titulo)
    {
    	this.titulo= titulo;
    }
    
    public String getDescripcionCorta()
    {
        return this.descripcionCorta;
    }
    
    public void setDescripcionCorta(String desC)
    {
    	this.descripcionCorta= desC;
    }
    
    public String getDescripcionLarga()
    {
        return this.descripcionLarga;
    }
    
    public void setDescripcionLarga(String desL)
    {
    	this.descripcionLarga= desL;
    }
}